﻿#ifndef QWIDGET_BASE_H
#define QWIDGET_BASE_H
#include <QWidget>
#include <QTouchEvent>
#include <QTimer>
#include <QRect>
#include <QApplication>
#include <QDesktopWidget>
//#include "QMsgBox.h"
//#include "QMsgBoxLong.h"
#include "CAppComm.h"
//#include "QWmixPlay.h"
#include "QUnits.h"

#define QT_OK 		Qt::Key_F6
#define QT_CLEAR 	Qt::Key_F5
#define TIMER_OUT_WIDGET 	30
#include <stdio.h>
#include <QDebug>


// 是否截屏
#define SCREENSHOT 0


#define NEW_QWIDGET_BASE(x,...) ({x *widget = new x(__VA_ARGS__); widget->createUI(); widget;})

#define START_WINDOW(x,isThisColse,isWindowStart,...)({  \
	QWidgetBase *parent= m_Parent;			\
	QWidgetBase *isThis = this;				\
	x *widget = nullptr;					\
	if(isThisColse) {						\
		if(isWindowStart) {					\
			isThis = getParentWindow();		\
			if(isThis->m_Parent)			\
				parent = isThis->m_Parent->getParentWindow();\
			else								\
				parent = nullptr;				\
		}										\
		widget = NEW_QWIDGET_BASE(x,##__VA_ARGS__,parent);	\
		if(isWindowStart) {						\
			if(parent)							\
				parent->delChird(widget);		\
		}										\
		widget->move(0,0);						\
		if(isThis->m_Parent)					\
			widget->resize(parent->width(),parent->height());\
		else									\
		{										\
			QRect rect = QApplication::desktop()->availableGeometry();\
			widget->resize(rect.width(),rect.height());\
		}										\
												\
	} else {									\
		if(isWindowStart) {						\
			isThis = getParentWindow();			\
		}										\
		widget = NEW_QWIDGET_BASE(x,##__VA_ARGS__,isThis);	\
		if(isWindowStart) {						\
			if(isThis)							\
				isThis->delChird(widget);		\
		}										\
		widget->move(0,0);						\
		widget->resize(isThis->width(),isThis->height());\
	}											\
	isThis->onStop();							\
	widget->setWindowStatus(isWindowStart);		\
	startWindow(widget);						\
	if(isWindowStart){							\
        /*int statrApp = CConfigUtils::getLocalConfig().startApp;\
		int detaultApp = CEntranceRunConfig::getSingleton().getStartAppPage();\
		if(statrApp == 1 || (statrApp == 0 && detaultApp == 0)){ \
            QMsgBox::getMsgBoxPtr(widget);		\
            QMsgBoxLong::Instance(widget);		\
        }*/ \
	}											\
	if(isThisColse) {							\
		isThis->close();						\
	}											\
	widget;										\
	})											\


class QWidgetBase : public QWidget
{
	Q_OBJECT
public:
    QWidgetBase(QWidgetBase *parent = nullptr);

    virtual ~QWidgetBase();

	// 绘图事件
	void paintEvent(QPaintEvent *event) override;
public:
    // 创建初始化UI
    virtual void initUI();
    // 初始化样式
    virtual void initStyleSheet();
    // 初始化连接
    virtual void initConnect();
	// 截屏
	virtual void screenshot();
	// 重载键盘事件
	virtual void keyPressEvent(QKeyEvent *event);

public:
	// 页面启动
    virtual void onStart();
    // 页面停止
    virtual void onStop();

private:
    // 初始化相关组件
    void initBase();
    // 释放相关组件
    void unInitBase();

public slots:
    // 创建UI
    void createUI();
	// 添加子节点
    void addChird(QWidgetBase *parent);
    // 删除子节点
    void delChird(QWidgetBase *parent);
    // 启动窗口
    void startWindow(QWidgetBase *widget);
    // 关闭窗口
    virtual void closeWindow();
    // 是否为窗口
    bool isWindowStatus();
    // 设置是否为窗口
    void setWindowStatus(bool status);
    // 获取窗口指针
    virtual QWidgetBase * getParentWindow();
    // 窗口启动
    void windowStart();
    // 窗口是否为活跃状态
    bool isActive();

private:
    // 子控件
    QList<QWidgetBase *> m_QListChirdControl;
    // 是否作为窗口启动
    bool         m_IsWindowStatus = false;
    // 记录窗口活跃状态
    bool         m_isActive = false;
public:
    // 父类
    QWidgetBase *m_Parent = nullptr;
};
#endif // QWIDGET_BASE_H
